VPC EndpointsにAWS SDK for JavaScript in Node.jsからアクセスする
VPCからS3へ直接アクセスできる!
待ちにまったS3のVPCエンドポイント対応です!NATインスタンスを冗長化して悶々としていた方に朗報でしたね。さて、早速試して見ようということで、画面からVPCエンドポイントの作成をすることができましたが、コマンドラインから実行できません。まだSDKが出てませんね。そこで、既存のSDKに機能追加して動作確認してみたいと思います。といっても、やり方は簡単です。
AWS SDK for JavaScriptに機能追加する
最も機能追加しやすいのはJavaScriptです。さっそくインストールしてみましょう。
npm install aws-sdk
インストールされたNodeモジュールは以下の場所に格納されています。
$ pwd /Users/hogehoge/node_modules/aws-sdk
そして、サービス名やAPI名などが以下に記述されています。
$ pwd /Users/hogehoge/node_modules/aws-sdk/apis
それではAPIを追加しましょうw
$ vi ec2-2015-03-01.min.json
以下のようなJSON定義を追加してください
"DescribeVpcEndpoints": { "input": { "type": "structure", "members": { "DryRun": { "locationName": "dryRun", "type": "boolean" }, "VpcEndpointId": { "locationName": "VpcEndpointId", "type": "list", "member": { "locationName": "VpcEndpointId" } }, "Filters": { "shape": "S6m", "locationName": "Filter" } } }, "output": { "type": "structure", "members": { "VpcEndpointSet": { "locationName": "vpcEndpointSet", "type": "list", "member": { "locationName": "item" } } } } }, "DescribeVpcEndpointServices": { "input": { "type": "structure", "members": { "DryRun": { "locationName": "dryRun", "type": "boolean" } } }, "output": { "type": "structure", "members": { "ServiceNameSet": { "locationName": "serviceNameSet", "type": "list", "member": { "locationName": "item" } } } } }, "DescribePrefixLists": { "input": { "type": "structure", "members": { "DryRun": { "locationName": "dryRun", "type": "boolean" }, "PrefixListId": { "locationName": "PrefixListId", "type": "list", "member": { "locationName": "PrefixListId" } }, "Filters": { "shape": "S6m", "locationName": "Filter" } } }, "output": { "type": "structure", "members": { "PrefixListSet": { "locationName": "prefixListSet", "type": "list", "member": { "locationName": "item" } } } } },
出来上がりです〜w。ポイントとしては、AWSのAPIを呼び出すための仕様書が用意されています。例えば、以下のドキュメントです。
Amazon Elastic Compute Cloud API Reference (API Version 2015-03-01) - DescribeVpcEndpoints
機能追加したSDKを使う
それでは、Node.jsを書いてみましょう。
DescribeVpcEndpointServices
DescribeVpcEndpointServicesは、VPNエンドポイントに対応したサービス一覧を表示します。今のところS3のみですが、このメソッド名から考えると、S3は始まりに過ぎず、今後どんどん追加されるのではと期待してしまいますね。
var AWS = require('aws-sdk'); AWS.config.region = 'ap-northeast-1'; var ec2 = new AWS.EC2(); params = {}; ec2.describeVpcEndpointServices(params, function(err, data) { if (err) console.log(err, err.stack); else console.log('data : %j',data); });
実行結果
data : {"ServiceNameSet":["com.amazonaws.ap-northeast-1.s3"]}
DescribePrefixLists
DescribePrefixListsは、VPCエンドポイントを示すプリフィックス名とIDと、IPレンジを表示してくれます。
var AWS = require('aws-sdk'); AWS.config.region = 'ap-northeast-1'; var ec2 = new AWS.EC2(); params = {}; ec2.describePrefixLists(params, function(err, data) { if (err) console.log(err, err.stack); else console.log('data : %j',data); });
実行結果
data : {"PrefixListSet":[{ "prefixListName":["com.amazonaws.ap-northeast-1.s3"], "prefixListId":["pl-61a540WW"], "cidrSet":[{"item":["54.231.224.0/21"]}]}]}
DescribeVpcEndpoints
DescribeVpcEndpointsは、どのVPCのどのルーティングテーブルに、VPCエンドポイントを設定し、どんなポリシーでアクセスできるか確認することができます。
var AWS = require('aws-sdk'); AWS.config.region = 'ap-northeast-1'; var ec2 = new AWS.EC2(); params = {}; ec2.describeVpcEndpoints(params, function(err, data) { if (err) console.log(err, err.stack); else console.log('data : %j',data); });
実行結果
data : {"VpcEndpointSet":[{ "vpcId":["vpc-5a9f67XX"], "state":["available"], "routeTableIdSet": [{"item":["rtb-9171b5ZZ"]}], "vpcEndpointId":["vpce-612dc8YY"], "creationTimestamp":["2015-05-12T01:25:20Z"], "policyDocument":[ "{\"Version\":\"2008-10-17\", \"Statement\":[{ \"Sid\":\"\", \"Effect\":\"Allow\", \"Principal\":\"*\", \"Action\":\"*\", \"Resource\":\"*\"}]}"], "serviceName":["com.amazonaws.ap-northeast-1.s3"]}]}
まとめ
ということで、今回は、邪道な方法ではありますがw、SDK公開前にAWS APIの操作を通じて、VPCエンドポイントについて概要を把握することができました。今日明日中には各プログラミング言語に対応した正式なSDKが出ると思いますので、基本的にはそちらを待ってからご利用ください。
参考資料
AWS SDK for JavaScript in Node.js
Amazon Virtual Private Cloud User Guide (API Version 2015-03-01) - VPC Endpoints
Amazon Elastic Compute Cloud API Reference (API Version 2015-03-01) - DescribePrefixLists